using Microsoft.AspNetCore.Mvc;
using WebProject.Models; // 引入模型文件，用于数据模型
using Microsoft.Data.SqlClient; // 引入数据库连接库

namespace WebProject.Controllers
{
    // ManagerController 继承自 BaseController，处理与学生管理相关的操作
    public class ManagerController : BaseController
    {
        // GET 请求方法，用于显示登录页面
        [HttpGet]
        public IActionResult Login()
        {
            return View(); // 返回名为 "Login" 的视图（即登录页面）
        }

        // 数据库连接字符串，用于连接到 SQL Server 数据库
        public string _connectionString = "Server=SK-20240829FRCQ\\SQLEXPRESS;Database=DB;User Id=sa;Password=123456;TrustServerCertificate=True";

        // POST 请求方法，用于处理提交的登录信息
        [HttpPost]
        public IActionResult Login(LoginModel model)
        {
            // 检查用户名或密码是否为空
            if (string.IsNullOrWhiteSpace(model.Username) || string.IsNullOrWhiteSpace(model.Password))
            {
                return Content("用户名或密码不能为空！"); // 如果为空，返回一条提示消息
            }

            // 调用 ValidateUser 方法验证用户名和密码是否正确
            if (ValidateUser(model.Username, model.Password))
            {
                // 登录成功，将用户名存储到 Session 中
                HttpContext.Session.SetString("Username", model.Username);
                return RedirectToAction("Index", "Manager"); // 登录成功后，重定向到 Manager 控制器的 Index 方法
            }
            else
            {
                // 登录失败，设置失败提示信息
                ViewBag.Message = "登录失败，请检查用户名和密码。";
                return View(); // 返回登录视图，显示错误消息
            }
        }

        // 账户验证逻辑：验证用户名和密码是否正确
        private bool ValidateUser(string username, string password)
        {
            // 使用 SqlConnection 连接到 SQL Server 数据库
            using (var connection = new SqlConnection(_connectionString))
            {
                connection.Open(); // 打开数据库连接
                var query = "SELECT COUNT(*) FROM Login WHERE Username = @Username AND Password = @Password"; // SQL 查询，检查用户名和密码是否匹配

                // 使用 SqlCommand 执行 SQL 查询
                using (var command = new SqlCommand(query, connection))
                {
                    // 为 SQL 查询参数添加值，防止 SQL 注入攻击
                    command.Parameters.AddWithValue("@Username", username);
                    command.Parameters.AddWithValue("@Password", password);

                    // 执行查询，返回匹配的记录数
                    var count = (int)command.ExecuteScalar(); // ExecuteScalar 返回查询的第一行第一列的值
                    return count > 0; // 如果找到匹配的记录，返回 true，表示登录成功
                }
            }
        }

        // 查询所有学生信息并显示
        public ActionResult Index()
        {
            // 创建一个学生列表
            List<StudentModel> students = new List<StudentModel>();

            // 使用 SqlConnection 连接到数据库
            using (SqlConnection conn = new SqlConnection(_connectionString))
            {
                string query = "SELECT StuNum, StuName, StuAge FROM student"; // 查询所有学生的信息（学号、姓名、年龄）

                // 使用 SqlCommand 执行查询
                using (SqlCommand cmd = new SqlCommand(query, conn))
                {
                    conn.Open(); // 打开数据库连接
                    using (SqlDataReader reader = cmd.ExecuteReader()) // 执行查询并返回结果
                    {
                        // 逐行读取查询结果
                        while (reader.Read())
                        {
                            // 创建一个学生模型对象，并赋值
                            var student = new StudentModel
                            {
                                StuNum = reader.GetInt32(0), // 学号
                                StuName = reader.GetString(1), // 姓名
                                StuAge = reader.GetInt32(2), // 年龄
                            };

                            students.Add(student); // 将学生对象添加到学生列表中
                        }
                    }
                }
            }

            return View(students); // 将学生列表传递给视图并返回
        }

        // 删除指定学生的信息
        [HttpPost]
        public ActionResult Delete(int id)
        {
            // 使用 SqlConnection 连接到数据库
            using (SqlConnection conn = new SqlConnection(_connectionString))
            {
                string query = "DELETE FROM student WHERE StuNum = @StuNum"; // SQL 删除查询，根据学号删除学生

                // 使用 SqlCommand 执行删除查询
                using (SqlCommand cmd = new SqlCommand(query, conn))
                {
                    cmd.Parameters.AddWithValue("@StuNum", id); // 添加学号参数

                    conn.Open(); // 打开数据库连接
                    cmd.ExecuteNonQuery(); // 执行删除操作
                }
            }

            return RedirectToAction("Index"); // 删除成功后重定向到 Index 页面，显示更新后的学生列表
        }

        // 编辑学生信息页面，显示指定学生的信息
        public IActionResult Edit(int id)
        {
            // 调用 GetStudentById 方法获取指定学生的信息
            var student = GetStudentById(id);
            return View(student); // 返回编辑视图，并传递学生信息
        }

        // 提交编辑的学生信息
        [HttpPost]
        public IActionResult Edit(StudentModel model)
        {
            // 如果模型验证通过
            if (ModelState.IsValid)
            {
                // 调用 Update 方法更新学生信息
                Update(model);
                return RedirectToAction("Index"); // 更新成功后重定向到 Index 页面
            }
            return View(model); // 如果模型验证失败，返回编辑页面，显示错误信息
        }

        // 获取所有学生信息
        private IEnumerable<StudentModel> GetAllStudents()
        {
            // 创建一个学生列表
            var students = new List<StudentModel>();
            using (var connection = new SqlConnection(_connectionString))
            {
                string query = "SELECT StuNum, StuName, StuAge FROM Student"; // 查询所有学生的信息

                // 使用 SqlCommand 执行查询
                using (var command = new SqlCommand(query, connection))
                {
                    connection.Open(); // 打开数据库连接
                    using (var reader = command.ExecuteReader()) // 执行查询并返回结果
                    {
                        // 逐行读取查询结果
                        while (reader.Read())
                        {
                            // 创建一个学生模型对象，并赋值
                            students.Add(new StudentModel
                            {
                                StuNum = reader.GetInt32(0), // 学号
                                StuName = reader.GetString(1), // 姓名
                                StuAge = reader.GetInt32(2) // 年龄
                            });
                        }
                    }
                }
            }
            return students; // 返回学生列表
        }

        // 根据学生学号获取单个学生信息
        private StudentModel GetStudentById(int id)
        {
            StudentModel student = null!; // 创建一个学生模型对象
            using (var connection = new SqlConnection(_connectionString))
            {
                string query = "SELECT StuNum, StuName, StuAge FROM Student WHERE StuNum = @id"; // 根据学号查询指定学生的信息

                // 使用 SqlCommand 执行查询
                using (var command = new SqlCommand(query, connection))
                {
                    command.Parameters.AddWithValue("@id", id); // 为查询添加学号参数
                    connection.Open(); // 打开数据库连接
                    using (var reader = command.ExecuteReader()) // 执行查询并返回结果
                    {
                        if (reader.Read()) // 如果查询到数据
                        {
                            student = new StudentModel
                            {
                                StuNum = reader.GetInt32(0), // 学号
                                StuName = reader.GetString(1), // 姓名
                                StuAge = reader.GetInt32(2) // 年龄
                            };
                        }
                    }
                }
            }
            return student; // 返回指定学生的信息
        }

        // 更新学生信息
        private void Update(StudentModel model)
        {
            // 使用 SqlConnection 连接到数据库
            using (var connection = new SqlConnection(_connectionString))
            {
                string query = "UPDATE Student SET StuName = @name, StuAge = @age WHERE StuNum = @id"; // SQL 更新查询，更新学生的姓名和年龄

                // 使用 SqlCommand 执行更新查询
                using (var command = new SqlCommand(query, connection))
                {
                    command.Parameters.AddWithValue("@name", model.StuName); // 姓名参数
                    command.Parameters.AddWithValue("@age", model.StuAge); // 年龄参数
                    command.Parameters.AddWithValue("@id", model.StuNum); // 学号参数
                    connection.Open(); // 打开数据库连接
                    command.ExecuteNonQuery(); // 执行更新操作
                }
            }
        }

        // 显示添加学生页面
        [HttpGet]
        public IActionResult Add()
        {
            return View(); // 返回添加学生视图
        }

        // 提交添加学生信息
        [HttpPost]
        public IActionResult Add(StudentModel model)
        {
            // 使用 SqlConnection 连接到数据库
            using (var connection = new SqlConnection(_connectionString))
            {
                string query = "INSERT INTO Student (StuNum, StuName, StuAge) VALUES (@id, @name, @age)"; // SQL 插入查询，插入学生信息

                // 使用 SqlCommand 执行插入查询
                using (var command = new SqlCommand(query, connection))
                {
                    command.Parameters.AddWithValue("@id", model.StuNum); // 学号参数
                    command.Parameters.AddWithValue("@name", model.StuName); // 姓名参数
                    command.Parameters.AddWithValue("@age", model.StuAge); // 年龄参数

                    connection.Open(); // 打开数据库连接

                    if (command.ExecuteNonQuery() > 0) // 如果插入成功
                    {
                        ViewBag.Message = "学生添加成功！"; // 设置成功消息
                        return View(); // 返回添加页面，显示成功消息
                    }
                    else
                    {
                        ViewBag.Message = "学生添加失败！"; // 设置失败消息
                        return View(); // 返回添加页面，显示失败消息
                    }
                }
            }
        }
    }
}
